package com.mastercard.assets.web.struts.actions;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.upload.FormFile;

import com.mastercard.assets.jpa.TblAsset;
import com.mastercard.assets.jpa.TblCampania;
import com.mastercard.assets.jpa.TblCategoria;
import com.mastercard.assets.jpa.TblCuentaPaquete;
import com.mastercard.assets.jpa.TblPaquete;
import com.mastercard.assets.jpa.TblSubcateg;
import com.mastercard.assets.jpa.TblTipoCampania;
import com.mastercard.assets.jpa.TblTipoCuenta;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.AssetAltaForm;
import com.mastercard.assets.web.struts.forms.AssetAsignarPaquetesForm;
import com.mastercard.assets.web.struts.forms.AssetBorrarForm;
import com.mastercard.assets.web.struts.forms.AssetBuscarForm;
import com.mastercard.assets.web.struts.forms.AssetEditarForm;
import com.mastercard.assets.web.struts.forms.AssetModificarPaquetesForm;
import com.mastercard.assets.web.struts.forms.CampanasPorAutorizarForm;
import com.mastercard.assets.web.struts.forms.FormasAgregarForm;
import com.mastercard.assets.web.struts.forms.FormasEditarForm;
import com.mastercard.assets.web.struts.forms.GenerarCampanaForm;
import com.mastercard.assets.web.struts.forms.GenerarCampanaRegistrarForm;
import com.mastercard.assets.web.struts.forms.LoginForm;
import com.mastercard.assets.web.util.to.ManejadorPaquetesAsignados;
import com.mastercard.assets.web.util.to.PaqueteAutorizado;
import com.mastercard.assets.web.util.to.UserLogin;

public class FormasEditarRegistrar
	extends
		Action
{
	public ActionForward execute(
							ActionMapping mapping , 
							ActionForm form ,
							HttpServletRequest request , 
							HttpServletResponse response )
		throws 
			IOException , 
			ServletException
	{
		HttpSession session = request.getSession( ) ;
		
		// en caos de null
		if( session == null )
			return mapping.findForward( "noLogin" ) ;
		
		// toma el userLogin
		UserLogin user = ( UserLogin ) session.getAttribute( "UserLogin" ) ;
		
		// en caso de null
		if( user == null )
			return mapping.findForward( "noLogin" ) ;
		
		FormasEditarForm f = ( FormasEditarForm ) form ;
		
		System.out.println( "FormasEditar: " + f.getNombreSalidas( ) ) ;
		
		// toma datos
		int operation = f.getOperacion( ) ;
		int cveForma = f.getCveForma( ) ;
		int cveSalida = f.getCveSalida( ) ;
		
		switch( operation )
		{
			// en caso de borrar salida
			case 1:
				
				try
				{
					boolean res = MasterCardDAO.removeExitFromForm( cveForma , cveSalida ) ;
					
					// en caso de exito, manda al detalle
					user.setNextWorkArea( "/FormasIndexIn.do?operation=3&cveForma=" + cveForma ) ;
				}catch( Exception e )
				{
					user.setMessageError( e.getMessage( ) ) ;
					
					// en caso de exito, manda al detalle
					user.setNextWorkArea( "/FormasIndexIn.do?operation=3&cveForma=" + cveForma ) ;
				}
				
				break ;
				
			// en caso de editar
			case 2 :
				
				try
				{
					FormFile fileForm = f.getArchivoForma( ) ;
					
					int res = MasterCardDAO.editForm( cveForma , f.getNombre( ) , f.getDescripcion( ) , f.getSalidas( ) , ( ( fileForm == null || fileForm.getFileName( ).trim( ).length( ) == 0 ) ? null : fileForm.getFileName( ) ) ) ;
					
					// en caso de no ser null
					if( fileForm != null && fileForm.getFileName( ).trim( ).length( ) > 0 )
					{
						try
						{
							// en caso de que no haya error
							// guarda el archivo
							// nombre d ela forma
							String filePath = MCUtil.extractFormaFileName( cveForma , fileForm.getFileName( ) ) ;
							
							System.out.println( "Forma: " + cveForma + " - " + filePath ) ;
							System.out.println( "Directorio de formas: " + MCUtil.FORMAS_DIR ) ;
							System.out.println( "Directorio de formas: " + MCUtil.getFormsDir( ) ) ;
							
							// borra todos los archivos relacionados con la forma
							MCUtil.removeAllFormFiles( cveForma ) ;
							
							// abre el archivo
							File formDir = new File( MCUtil.getFormsDir( ) ) ;
							if( ! formDir.exists( ) )
								formDir.mkdirs( ) ;
							
							File formFile = new File( formDir , filePath ) ;
							System.out.println( "Ruta de forma: " + formFile.getAbsolutePath( ) ) ;
							FileOutputStream out = new FileOutputStream(  formFile , false ) ;
							out.write( f.getArchivoForma( ).getFileData( ) ) ;
							out.close( ) ;
							
							System.out.println( "Cambia el nextWorkArea a /FormasIndexIn.do" ) ;
							user.setNextWorkArea( "/FormasIndexIn.do?operation=3&cveForma=" + cveForma ) ;
							
                                                        MasterCardDAO.closeEntityManager( ) ;
							return mapping.findForward( "success" ) ;
						}catch( Exception e )
						{
							e.printStackTrace( ) ;
							try
							{
								MasterCardDAO.removeFileFromForm( cveForma ) ;
							}catch( Exception e1 )
							{
								MasterCardDAO.closeEntityManager( ) ;
							}
							
							user.setMessageError( e.getMessage( ) ) ;
							user.setNextWorkArea( "/FormasIndexIn.do?operation=3&cveForma=" + cveForma ) ;
							
                                                        MasterCardDAO.closeEntityManager( ) ;
							return mapping.findForward( "success" ) ;
						}
						
					}
					
					// en caso de exito, manda al detalle
					user.setNextWorkArea( "/FormasIndexIn.do?operation=3&cveForma=" + cveForma ) ;
				}catch( Exception e )
				{
					user.setMessageError( e.getMessage( ) ) ;
					
					// en caso de exito, manda al detalle
					user.setNextWorkArea( "/FormasIndexIn.do?operation=3&cveForma=" + cveForma ) ;
				}
				
				break ;
				
				// en caso de cancelar
			case 3 :
				
				user.setNextWorkArea( "/FlujosIndexIn.do" ) ;
				
				
				break ;
			// cualquier otro caso
			default:
				
				break ;
		}
		
                MasterCardDAO.closeEntityManager( ) ;
		return mapping.findForward( "success" ) ;
		
	}
	
}
